﻿using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;

namespace YougeBookmark.Models
{
    /// <summary>
    /// 书签标签关联模型（对应bookmark_tags中间表）
    /// 实现功能：
    /// 1. 维护多对多关系
    /// 2. 存储关联备注信息
    /// 3. 记录关联时间
    /// </summary>
    [Table("bookmark_tags")]  // 明确指定表名
    public class BookmarkTag
    {
        private DateTime _createdTime;

        /// <summary>
        /// 初始化关联实例（自动设置创建时间）
        /// </summary>
        public BookmarkTag()
        {
            _createdTime = DateTime.Now;
        }

        /// <summary>
        /// 书签ID（外键，级联删除）
        /// </summary>
        [Required]
        [Column("bookmark_id")]
        public int BookmarkId { get; set; }

        /// <summary>
        /// 标签ID（外键，级联删除）
        /// </summary>
        [Required]
        [Column("tag_id")]
        public int TagId { get; set; }

        /// <summary>
        /// 关联备注说明（允许空值，最大长度200字符）
        /// </summary>
        [MaxLength(200)]
        [Column("remark")]
        public string Remark { get; set; }

        /// <summary>
        /// 关联创建时间（UTC时间，自动初始化）
        /// </summary>
        [Column("created_time")]
        public DateTime CreatedTime
        {
            get => _createdTime.ToUniversalTime();
            /*private*/ set => _createdTime = value;
        }

        // 导航属性

        /// <summary>
        /// 关联的书签实例（延迟加载）
        /// </summary>
        [ForeignKey("BookmarkId")]
        public virtual Bookmark Bookmark { get; set; }

        /// <summary>
        /// 关联的标签实例（延迟加载）
        /// </summary>
        [ForeignKey("TagId")]
        public virtual Tag Tag { get; set; }

        /// <summary>
        /// 更新关联备注（带空值自动处理）
        /// </summary>
        /// <param name="newRemark">新备注（自动修剪空白）</param>
        public void UpdateRemark(string newRemark)
        {
            Remark = string.IsNullOrWhiteSpace(newRemark)
                ? null
                : newRemark.Trim();
        }

        /// <summary>
        /// 验证关联有效性（需在数据库操作前调用）
        /// </summary>
        /// <exception cref="InvalidOperationException">验证失败时抛出</exception>
        public void Validate()
        {
            if (BookmarkId <= 0)
                throw new InvalidOperationException("无效的书签ID");

            if (TagId <= 0)
                throw new InvalidOperationException("无效的标签ID");
        }
    }
}